//============================================================================
// Name        : Verification.cpp
// Author      : xdu
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <queue>
#include "Verification.h"

using namespace std;


int Verifier(StructureXml xml, StructureEntiteDTD dtd)
{
	int ret;
	queue<ElementXml> children;
	children.push(xml.GetRoot());
	while (!children.empty())
	{
		ElementXml e = children.front();
		children.pop();
		list<ElementXml> listChildren = e.GetChildList();
		vector<string> listChildrenString = ListToVector(listChildren);
		list<ElementXml>::iterator iChildren = listChildren.begin();
		while (iChildren != listChildren.end())
		{
			children.push(*iChildren);
			iChildren++;
		}
		ret = dtd.getElement("rapport")->verifierStructure(listChildrenString);
	}

	return ret;
}

vector<string> ListToVector(list<ElementXml> l)
{
	vector<string> children;
	list<ElementXml>::iterator i = l.begin();
	while (i != l.end())
	{
		children.push_back(i->GetName());
		i++;
	}
	return children;
}

int main() {

	StructureXml s("rapport","");
	ElementXml &e = s.GetRoot();
	e.AddChild("titre","realiser");
	ElementXml &e1 = e.AddChild("auteur","Jean Dupont");
	e.AddChild("resume", "Ceci est un extrait..");
	ElementXml &e2 = e.AddChild("chapitre","Chapitre 1");
	e.Afficher();


	/*
DTD:
<!ELEMENT rapport (titre, auteur+, resume, chapitre+)>
<!ELEMENT auteur (prenom, nom)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT resume (#PCDATA)>
<!ELEMENT chapitre (titre, (p | section)+)>
<!ELEMENT section (titre, p+)>
<!ELEMENT p (#PCDATA)>
<!ELEMENT titre (#PCDATA)>

	*/
	DTDElement rapport("rapport");
	DTDElement titre("titre");
	DTDElement auteur("auteur");
	DTDElement resume("resume");
	DTDElement chapitre("chapitre");
	DTDElement nom("nom");
	DTDElement prenom("prenom");
	DTDElement p("p");
	DTDElement section("section");

	AppEntite ae11(&titre, 0);
	AppEntite ae12(&auteur, 1);
	AppEntite ae13(&resume, 0);
	AppEntite ae14(&chapitre, 1);
	vector<AppEntite> vae11;
	vae11.push_back(ae11);
	vae11.push_back(ae12);
	vae11.push_back(ae13);
	vae11.push_back(ae14);
	vector<int> vae12;
	vae12.push_back(1);
	vae12.push_back(1);
	vae12.push_back(1);
	DTDEnsemble ens1(vae11,vae12);
	AppEntite ae1(&ens1, 0);

	DTDPhraseElement phrase1(rapport, 0);
	phrase1.ajouterEnsemble(ens1, 0);

	StructureEntiteDTD StruDTD;

	StruDTD.ajouterPhrase(&phrase1);

	cout << phrase1.getAffichage();
	int ret = Verifier(s,StruDTD);
	cout << endl << ret << endl;
	return 0;
}
